try:
    import random
    import string
    import re
    import sys


    def random_string(length=15):
        """生成指定长度的随机字符串"""
        letters = string.ascii_letters + string.digits  # 包含大小写字母和数字
        return ''.join(random.choices(letters, k=length))


    print("请输入代码 (按Ctrl+Z(Windows)结束输入):")
    code = sys.stdin.read().split('\n')

    for i in range(len(code)):
        code[i] = ' ' + code[i]

    allDef = []


    def suf(match):
        rdm = f"_{random_string(8)}"
        allDef.append(f"#define {rdm} {match.group()}\n")
        return ' ' + rdm + ' \n'


    # 移除注释的函数
    def remove_comments(line):
        # 移除单行注释 (// ...)
        line = re.sub(r'//.*', '', line)
        # 移除多行注释 (/* ... */) - 这里只处理单行内的多行注释
        line = re.sub(r'/\*.*?\*/', '', line)
        return line


    # 标识符混淆函数
    def obfuscate_identifiers(line):
        # 匹配C/C++标识符的模式：以下划线或字母开头，后跟字母、数字或下划线
        pattern = r'(?<!\w)([a-zA-Z_][a-zA-Z0-9_]*)(?!\w)'

        def replace_match(match):
            identifier = match.group(1)
            # 跳过关键字和宏定义
            keywords = {'auto', 'break', 'case', 'char', 'const', 'continue', 'default',
                        'do', 'double', 'else', 'enum', 'extern', 'float', 'for', 'goto',
                        'if', 'int', 'long', 'register', 'return', 'short', 'signed',
                        'sizeof', 'static', 'struct', 'switch', 'typedef', 'union',
                        'unsigned', 'void', 'volatile', 'while', 'printf', 'scanf',
                        'main', 'include', 'define', 'ifdef', 'ifndef', 'endif'}
            if identifier in keywords or identifier.startswith('_'):
                return identifier
            # 生成随机替换名称
            rdm = f"_{random_string(8)}"
            allDef.append(f"#define {rdm} {identifier}\n")
            return rdm

        return re.sub(pattern, replace_match, line)


    # 询问用户是否开启标识符混淆
    enable_identifier_obfuscation = input("是否开启标识符混淆？(Y/n): ").strip().lower() == 'y'
    # 询问用户是否清除注释
    remove_comments_option = input("是否清除注释？(Y/n): ").strip().lower() == 'y'

    for i in range(len(code)):
        if code[i].strip().startswith('#'):
            code[i] += '\n'
            continue

        # 如果用户选择清除注释
        if remove_comments_option:
            code[i] = remove_comments(code[i])

        # 如果用户选择开启标识符混淆
        if enable_identifier_obfuscation:
            code[i] = obfuscate_identifiers(code[i])
        # 处理字符串和数字
        code[i] = re.sub(r"\".*\"|\'.*\'", suf, code[i])
        code[i] = re.sub(r"(?<=\s)(?!#)\S+(?=\s)", suf, code[i])

    code = allDef + code

    print("\n\n")
    print("混淆后的代码:")
    print(''.join(code))
except KeyboardInterrupt:
    print("\n程序已中断")